package edu.upc.bolsatrabajo.model.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import edu.upc.bolsatrabajo.model.domain.Anuncio;
import edu.upc.bolsatrabajo.model.domain.Empresa;
import edu.upc.bolsatrabajo.model.iface.IAnuncio;

@Repository
public class AnuncioImpl implements IAnuncio {

	@Autowired
	private DataSource dataSource;

	Connection connection = null;
	PreparedStatement statement = null;
	ResultSet resultSet = null;

	public List<Anuncio> listarAnuncios(Anuncio oAnuncio) {
		List<Anuncio> Anuncios = new ArrayList<Anuncio>();
		String sqlListarAnuncios = "SELECT * FROM TAB_ANUNCIO ";
		sqlListarAnuncios += " WHERE 1=1 ";
		sqlListarAnuncios += " AND C_NOMBRE_ANUNCIO LIKE '%" + oAnuncio.getNombre() + "%' ";		
		sqlListarAnuncios += " AND C_LOCALIDAD LIKE '%" + oAnuncio.getLocalidad() + "%' ";
		if(oAnuncio.getFechaPublicacion() != null) 	sqlListarAnuncios += " AND STR_TO_DATE(D_FECHA_PUBLICACION, '%m/%d/%Y') = STR_TO_DATE( ? , '%m/%d/%Y') ";
		sqlListarAnuncios += " ORDER BY D_FECHA_PUBLICACION DESC";
		 

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlListarAnuncios);
			
			if(oAnuncio.getFechaPublicacion() != null) statement.setDate(1, oAnuncio.getFechaPublicacion());
			
			resultSet = statement.executeQuery(sqlListarAnuncios);

			while (resultSet.next()) {
				oAnuncio = new Anuncio();
				oAnuncio.setCodigo(resultSet.getInt("N_CODIGO_ANUNCIO"));
				oAnuncio.setNombre(resultSet.getString("C_NOMBRE_ANUNCIO"));
				oAnuncio.setDescripcion(resultSet.getString("C_DESCRIPCION"));
				oAnuncio.setEmpresa(new Empresa(resultSet.getInt("N_CODIGO_EMPRESA")));
				Anuncios.add(oAnuncio);
			}

		} catch (Exception e) {
			//throw new RuntimeException("SQL exception occurred finding Anuncio", e);
			e.printStackTrace();
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}

		return Anuncios;
	}

	public int insertarAnuncio(Anuncio oAnuncio) {

		int respuesta = 0;
		String sqlInsertarAnuncio = "INSERT INTO TAB_ANUNCIO " +
				" (C_NOMBRE_ANUNCIO, C_DESCRIPCION, D_FECHA_PUBLICACION, N_CODIGO_EMPRESA) " +
				" VALUES (?,?,?,?)";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlInsertarAnuncio);
			statement.setString(1, oAnuncio.getNombre());
			statement.setString(2, oAnuncio.getDescripcion());
			statement.setDate(3, oAnuncio.getFechaPublicacion());
			statement.setInt(4, oAnuncio.getEmpresa().getCodigo());
			statement.executeUpdate();
			
			respuesta = 1;

		} catch (Exception e) {
			//throw new RuntimeException("SQL exception occurred insert Anuncio", e); 
			e.printStackTrace();
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}

	public int actualizarAnuncio(Anuncio oAnuncio) {

		int respuesta = 0;
		String sqlActualizarAnuncios = "UPDATE TAB_Anuncio SET " +
				"(C_NOMBRE_ANUNCIO, C_DESCRIPCION, D_FECHA_PUBLICACION) " +
				" = (?,?,?) WHERE N_CODIGO_Anuncio = ?";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlActualizarAnuncios);
			statement.setString(1, oAnuncio.getNombre());
			statement.setString(2, oAnuncio.getDescripcion());
			statement.setDate(3, oAnuncio.getFechaPublicacion());
			statement.setInt(4, oAnuncio.getCodigo());
			statement.executeQuery(sqlActualizarAnuncios);
			
			respuesta = 1;

		} catch (Exception e) {
			throw new RuntimeException("SQL exception occurred finding Usuario", e); 
			
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}

	public int eliminarAnuncio(Anuncio oAnuncio) {

		int respuesta = 0;
		String sqlEliminarAnuncio = "DELETE FROM TAB_ANUNCIO WHERE " +
				" N_CODIGO_ANUNCIO = ? ";

		try {
			connection = dataSource.getConnection();
			statement = connection.prepareStatement(sqlEliminarAnuncio);
			statement.setInt(1, oAnuncio.getCodigo());
			statement.executeQuery(sqlEliminarAnuncio);
			
			respuesta = 1;

		} catch (Exception e) {
			throw new RuntimeException("SQL exception occurred finding Anuncio", e); 
			
		} finally {
			if (resultSet != null) {
				try {
					// Close to prevent database cursor exhaustion
					resultSet.close();
				} catch (SQLException ex) {
				}
			}
			if (statement != null) {
				try {
					// Close to prevent database cursor exhaustion
					statement.close();
				} catch (SQLException ex) {
				}
			}
			if (connection != null) {
				try {
					// Close to prevent database connection exhaustion
					connection.close();
				} catch (SQLException ex) {
				}
			}
		}
		return respuesta;
	}

}
